package com.bw.util;


import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;

public class JwtUtils {
    //密钥
    public static final String SECRET = "zjKkye4PN59B2wriTjtVCo3BOYoD1B";
    //过期时间 30分钟
    public static final long EXPIRE = 1000 * 60 * 30;

    /**
     * 根据入参进行一系列的加密，生成一个token
     *
     * @param payload 入参是一个对象，一般传入用户的基本信息
     * @return 返回一个token
     */
    public static String createToken(Object payload, Integer expire) {
        String jwtToken = Jwts.builder()
                .setHeaderParam("typ", "JWT")
                .setHeaderParam("alg", "HS256")//使用hs256算法进行加密  此算法是对称性加密
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + expire * 1000 * 60))//设置token的有效截止时间
                .claim("payload", JSONUtil.toJsonStr(payload))//存放载荷（用户信息）
                .signWith(SignatureAlgorithm.HS256, SECRET)
                .compact();
        return jwtToken;
    }

    /**
     * 验证token是否有效
     *
     * @param jwtToken
     * @return
     */
    public static boolean validToken(String jwtToken) {
        if (StrUtil.isEmpty(jwtToken)) {
            return false;
        }
        try {
            Jwts.parser().setSigningKey(SECRET).parseClaimsJws(jwtToken);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 获取token里的载荷（用户信息）
     *
     * @param jwtToken
     * @return
     */
    public static String parseToken(String jwtToken) {
        if (StrUtil.isEmpty(jwtToken)) {
            return null;
        }
        try {
            Jws<Claims> claimsJws = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(jwtToken);
            Claims claims = claimsJws.getBody();
            return (String) claims.get("payload");
        } catch (Exception e) {
            return null;
        }
    }

    public static <T> T getLoginUserFromRequest(String tokenFromRequest, Class<T> c) {
        try {
            if (tokenFromRequest != null && tokenFromRequest != "") {
                //请求获取令牌
                //解密令牌
                String payloadByJwtToken = JwtUtils.parseToken(tokenFromRequest);
                if (StrUtil.isBlank(payloadByJwtToken)) {
                    System.out.println("没有获取到当前登录用户，请检查自己的token");
//                throw new RuntimeException("请先登录再访问列表页");
                    return null;
                }
                //强制转成对象返回去
                T t = JSONUtil.toBean(payloadByJwtToken, c);
                return t;
            } else {
                System.out.println("没有获取到当前登录用户，请检查自己的token");
            }
        } catch (Exception e) {


        }

        return null;
    }

}

